/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package View;

import Dao.AlunoDao;
import Dao.AlunoDaoImplJPA;
import Dao.AtividadeDao;
import Dao.AtividadeDaoImplJPA;
import Dao.HistoricoDao;
import Dao.HistoricoTurmaDao;
import Dao.HistoricoTurmaDaoImplJPA;
import Dao.NotaDao;
import Dao.NotaDaoImplJPA;
import Dao.TurmaDao;
import Dao.TurmaDaoImplJPA;
import Pojo.Aluno;
import Pojo.Atividade;
import Pojo.Nota;
import Pojo.Professor;
import Pojo.Turma;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author thiago
 */
public class FormLancarNotas extends javax.swing.JInternalFrame {

    /**
     * Acesso necessário para o caso de chamar o cadastro de professore
     */
    private int acesso;
    
    /** 
     * String de modificação. N=novo, A=alteração
     */
    private String modificacao;
    
    /**
     * Objeto professor para acesso.
     */
    private Professor professorAcesso;
    
    /** Turma atual*/
    private Turma turmaAtual;
    
    /** Atividade atual */
    private Atividade atividadeAtual;
    
    /**
     * Getter do acesso
     * @return 
     */
    public int getAcesso() {
        return acesso;
    }
    
    /**
     * Setter de acesso
     * @param acesso 
     */
    private void setAcesso(int acesso){
        this.acesso = acesso;
    }

    /**
     * Getters de professor
     * @return 
     */
    public Professor getProfessorAcesso() {
        return professorAcesso;
    }

    /**
     * setter de professor
     * @param professorAcesso 
     */
    private void setProfessorAcesso(Professor professorAcesso) {
        this.professorAcesso = professorAcesso;
    }
    
    /**
     * Getter da turma atual
     * @return 
     */
    public Turma getTurmaAtual() {
        return turmaAtual;
    }

    /**
     * Setter da turma atual
     * @param turmaAtual 
     */
    private void setTurmaAtual(Turma turmaAtual) {
        this.turmaAtual = turmaAtual;
    }

    /**
     * Getter da atividade atual
     * @return 
     */
    public Atividade getAtividadeAtual() {
        return atividadeAtual;
    }

    /**
     * Setter da atividade atual
     * @param atividadeAtual 
     */
    private void setAtividadeAtual(Atividade atividadeAtual) {
        this.atividadeAtual = atividadeAtual;
    }
    
    
    
    /**
     * Creates new form FormLancarNotas
     */
    public FormLancarNotas(int acesso, Professor professor) {
        initComponents();
        this.setAcesso(acesso);
        this.setProfessorAcesso(professor);
        this.buscarTurmasProfessor();
    }
    
    public FormLancarNotas(int acesso, Professor professor, Turma turma){
        initComponents();
        this.setAcesso(acesso);
        this.setProfessorAcesso(professor);
        this.buscarTurmasProfessor();
        this.setTurmaAtual(turma);
        cbbTurmas.setSelectedItem(turma.getId()+" - "+turma.getDisciplina().getNome()+" - "+turma.getAno()+" - "+turma.getPeriodo());
        this.carregarDadosTabelaAtividades();
        DefaultTableModel model = (DefaultTableModel) tblAlunosNota.getModel();
        model.setRowCount(0);
    }

    private void buscarTurmasProfessor(){
        TurmaDao turmaDao = new TurmaDaoImplJPA();
        List<Turma> listaTurmas = turmaDao.pesquisarPorProfessor(this.getProfessorAcesso());
        
        for(Turma turma : listaTurmas){
            if (turma.getFinalizada()==false){
                cbbTurmas.addItem(turma.getId()+" - "+turma.getDisciplina().getNome()+" - "+turma.getAno()+" - "+turma.getPeriodo());
            }
        }
    }
    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane2 = new javax.swing.JScrollPane();
        jTable2 = new javax.swing.JTable();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        cbbTurmas = new javax.swing.JComboBox();
        btnCarregarAtividades = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        tblAtividades = new javax.swing.JTable();
        jPanel2 = new javax.swing.JPanel();
        jScrollPane3 = new javax.swing.JScrollPane();
        tblAlunosNota = new javax.swing.JTable();
        jLabel2 = new javax.swing.JLabel();
        txtAtividade = new javax.swing.JTextField();
        btnSalvarNotas = new javax.swing.JButton();

        jTable2.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane2.setViewportView(jTable2);

        setClosable(true);
        setTitle("Lançamento de Notas");

        jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        jLabel1.setText("Turmas");

        btnCarregarAtividades.setText("Carregar Atividades");
        btnCarregarAtividades.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCarregarAtividadesActionPerformed(evt);
            }
        });

        tblAtividades.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Código", "Atividade", "Tipo", "Data", "Valor"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tblAtividades.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tblAtividadesMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(tblAtividades);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cbbTurmas, javax.swing.GroupLayout.PREFERRED_SIZE, 244, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnCarregarAtividades, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(btnCarregarAtividades)
                    .addComponent(cbbTurmas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Alunos"));

        tblAlunosNota.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Código", "Aluno", "Nota"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.Double.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, true
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jScrollPane3.setViewportView(tblAlunosNota);

        jLabel2.setText("Atividade");

        txtAtividade.setEnabled(false);

        btnSalvarNotas.setText("Salvar Notas");
        btnSalvarNotas.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSalvarNotasActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane3)
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txtAtividade)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(btnSalvarNotas)))
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(jLabel2)
                    .addComponent(txtAtividade, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnSalvarNotas))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 195, Short.MAX_VALUE)
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void carregarDadosTabelaAtividades(){
        AtividadeDao atividadeDao = new AtividadeDaoImplJPA();
        List<Atividade> listaAtividades = atividadeDao.pesquisarPorTurma(this.getTurmaAtual());
        
        if (listaAtividades.size()>0){
            DefaultTableModel model = (DefaultTableModel) tblAtividades.getModel();
            Object[] linha = new Object[5];

            model.setRowCount(0);

            for (Atividade a: listaAtividades){
                linha[0] = String.valueOf(a.getId());
                linha[1] = a.getNome();
                linha[2] = a.getTipo();
                DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
                String dataString; 
                try{
                    dataString = formatter.format(a.getData().getTime()); 
                }catch(Exception e){
                    System.err.print(e);
                    dataString = null;
                }
                linha[3] = dataString;
                linha[4] = a.getValor();
                model.addRow(linha);
            }
            tblAtividades.repaint();
        }else{
            JOptionPane.showConfirmDialog(null, "A turma não tem nenhuma atividade cadastrada.");
        }
    }
    
    private void carregarDadosTabelaAlunosNota(){
        HistoricoTurmaDao historicoTurmaDao = new HistoricoTurmaDaoImplJPA();
        NotaDao notaDao = new NotaDaoImplJPA();
        Nota nota;
        
        List<Aluno> listaAlunos = historicoTurmaDao.pesquisarAlunosTurma(this.getTurmaAtual());
        
        DefaultTableModel model = (DefaultTableModel) tblAlunosNota.getModel();
        Object[] linha = new Object[4];

        model.setRowCount(0);

        for (Aluno a: listaAlunos){
            linha[0] = String.valueOf(a.getId());
            linha[1] = a.getNome();
            nota = notaDao.pesquisarNota(a, this.getAtividadeAtual());
            if (nota!=null){
                linha[2] = nota.getNota();
            }
            
            model.addRow(linha);
        }
        tblAlunosNota.repaint();
        txtAtividade.setText(title);
    }
    
    private void btnCarregarAtividadesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCarregarAtividadesActionPerformed
        String turmaString = (String) cbbTurmas.getSelectedItem();
        if (turmaString!=null){
            String[] dados = turmaString.split(" - ");
            TurmaDao turmaDao = new TurmaDaoImplJPA();
            Turma turma = turmaDao.pesquisarPorId(Integer.parseInt(dados[0]));
            this.setTurmaAtual(turma);

            this.carregarDadosTabelaAtividades();
            DefaultTableModel model = (DefaultTableModel) tblAlunosNota.getModel();
            model.setRowCount(0);
        }
    }//GEN-LAST:event_btnCarregarAtividadesActionPerformed

    private void tblAtividadesMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tblAtividadesMouseClicked
        if (tblAtividades.getSelectedRow()>=0){
            int linha = tblAtividades.getSelectedRow();
            AtividadeDao atividadeDao = new AtividadeDaoImplJPA();
            Atividade atividade = atividadeDao.pesquisarPorId(Integer.parseInt(tblAtividades.getValueAt(linha, 0).toString()));
            this.setAtividadeAtual(atividade);
            
            this.carregarDadosTabelaAlunosNota();
        }
    }//GEN-LAST:event_tblAtividadesMouseClicked

    private void btnSalvarNotasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSalvarNotasActionPerformed
        //Verificando a existência de uma turma
        if (this.getTurmaAtual()==null){
            JOptionPane.showMessageDialog(null, "Escolha a turma para poder matricular os alunos.");
            return;
        }
        
        //Verificando a existência de uma atividade
        if (this.getAtividadeAtual()==null){
            JOptionPane.showMessageDialog(null, "Escolha a atividade para poder matricular os alunos.");
            return;
        }
        
        int linha=0;
        double valor;
        int idNota;
        NotaDao notaDao = new NotaDaoImplJPA();
        AlunoDao alunoDao = new AlunoDaoImplJPA();
        Nota nota;
        Aluno aluno;
        List listaNotasErradas = new ArrayList();
        while(linha < tblAlunosNota.getRowCount()){
            aluno = alunoDao.pesquisarPorId(Integer.parseInt(tblAlunosNota.getValueAt(linha, 0).toString()));
            if (notaDao.verificarLancamento(aluno, this.getAtividadeAtual())==0){
                if (!tblAlunosNota.getValueAt(linha, 2).toString().equals("")){
                    valor = Double.parseDouble(tblAlunosNota.getValueAt(linha, 2).toString());
                    if ((valor>this.getAtividadeAtual().getValor())||(valor<0)){
                        listaNotasErradas.add(Integer.parseInt(tblAlunosNota.getValueAt(linha, 0).toString()));
                    }else{
                        nota = new Nota(valor,aluno,this.getAtividadeAtual());
                        notaDao.inserir(nota);
                    }
                }
            }else{
                if (!tblAlunosNota.getValueAt(linha, 2).toString().equals("")){
                    valor = Double.parseDouble(tblAlunosNota.getValueAt(linha, 2).toString());
                    if ((valor>this.getAtividadeAtual().getValor())||(valor<0)){
                        listaNotasErradas.add(Integer.parseInt(tblAlunosNota.getValueAt(linha, 0).toString()));
                    }else{
                        nota = notaDao.pesquisarNota(aluno, this.getAtividadeAtual());
                        nota = new Nota(nota.getId(),valor,aluno,this.getAtividadeAtual());
                        notaDao.alterar(nota);
                    }
                }
                
            }
            linha++;
        }
        
        if (listaNotasErradas.size()>0){
            String mensagem="A(s) nota(s) do(s) aluno(s) ";
            Iterator i = listaNotasErradas.iterator();
            while(i.hasNext()){
                int codigo = (Integer) i.next();
                aluno = alunoDao.pesquisarPorId(codigo);
                if (i.hasNext()){
                    mensagem += aluno.getNome()+", ";
                }else{
                    mensagem += aluno.getNome();
                }
            }
            mensagem += " não puderam ser salvas.\nAs notas para esta atividade não podem ser negativas nem maiores que "+this.getAtividadeAtual().getValor()+".";
            JOptionPane.showMessageDialog(null, mensagem);
        }else{
            JOptionPane.showMessageDialog(null, "Nota dos alunos gravadas com sucesso.");
        }
        
        this.carregarDadosTabelaAlunosNota();
    }//GEN-LAST:event_btnSalvarNotasActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnCarregarAtividades;
    private javax.swing.JButton btnSalvarNotas;
    private javax.swing.JComboBox cbbTurmas;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JTable jTable2;
    private javax.swing.JTable tblAlunosNota;
    private javax.swing.JTable tblAtividades;
    private javax.swing.JTextField txtAtividade;
    // End of variables declaration//GEN-END:variables
}
